package com.itheima.controller;

import com.itheima.commons.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * @author Tang
 * @date 2023/1/9
 */

/**
 * 优化：
 * 1.文件路径：在配置文件中做动态的配置
 * 2.文件名称：通过前端传递过来的文件取文件名（存在文件被覆盖）|通过UUID来生成文件名（推荐）
 * 3.文件后缀：通过前端传递过来的文件获取后缀名
 */
@Slf4j
@RequestMapping("/common")
@RestController
public class CommonController {
    @Value("${reggie.upload-path}")
    private String path;

    /**
     * 文件上传
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) throws IOException {
        //上传的文件是一个临时文件，需要指定保存地址，否则本次请求结束后该文件被删除
        log.info("文件名：{}",file.getOriginalFilename());

        //优化：
        //1.文件名：通过UUID来生成文件名（推荐）
        //文件后缀：通过前端传递过来的文件获取后缀名
        String originalFilename = file.getOriginalFilename();  //eg:  002.jpg  下标012 3456
        String suffix = ".jpg";
        if (originalFilename != null) {
            suffix = originalFilename.substring(originalFilename.indexOf(".")); //suffix=.jpg
        }
        String filename = UUID.randomUUID().toString() + suffix;

        //2.先判断当前文件夹是否存在，不存在的话需要创建出来，mkdirs()可以递归创建
        File dir = new File(path);
        if (!dir.exists()) {
            dir.mkdirs();  //img/aaa/bbb/
        }
        //path + filename ----> D:\img\xxx-xx-xx-xx.jpg
        file.transferTo(new File(path + filename));
        //3.返回服务器上传的文件名称
        return R.success(filename);

        /*//1.设置文件上传的路径  (路径是包含文件名称)
        String path = "D:\\a.jpg";
        //2.保存上传文件
        file.transferTo(new File(path));
        //3.返回服务器上传的文件名称
        return R.success("a.jpg");*/
    }

    /**
     * 文件下载
     * @param name
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) throws IOException {
        //1.创建一个输入流对象 FileInputStream
        FileInputStream fileInputStream = new FileInputStream(path + name);

        //2.通过HttpServletResponse去获取输出流
        ServletOutputStream outputStream = response.getOutputStream();

        //3.数据读写 10240=10kb  eg：文件大小12kb
        byte[] bytes = new byte[10240];
        while (fileInputStream.read(bytes) != -1){
            outputStream.write(bytes);
        }

        //4.关闭流
        fileInputStream.close();
        outputStream.close();
    }

}
